#!/bin/bash

# 本地开发环境设置脚本 - 不依赖Docker拉取
set -e

echo "🚀 设置本地开发环境（无需Docker镜像拉取）"
echo "============================================="

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }

# 检查系统要求
check_requirements() {
    log_info "检查系统要求..."
    
    # 检查Node.js
    if ! command -v node > /dev/null; then
        log_error "Node.js 未安装，请先安装 Node.js 18+"
        echo "下载地址: https://nodejs.org/"
        exit 1
    fi
    
    NODE_VERSION=$(node --version | cut -d 'v' -f 2 | cut -d '.' -f 1)
    if [ "$NODE_VERSION" -lt 18 ]; then
        log_error "Node.js 版本过低，需要 18+，当前版本: $(node --version)"
        exit 1
    fi
    
    log_success "Node.js 版本检查通过: $(node --version)"
    
    # 检查npm
    if ! command -v npm > /dev/null; then
        log_error "npm 未安装"
        exit 1
    fi
    
    log_success "npm 版本: $(npm --version)"
}

# 安装 MongoDB 本地版本
install_mongodb_local() {
    log_info "设置 MongoDB..."
    
    if command -v mongod > /dev/null; then
        log_success "MongoDB 已安装"
        return 0
    fi
    
    # macOS 使用 Homebrew
    if [[ "$OSTYPE" == "darwin"* ]]; then
        if command -v brew > /dev/null; then
            log_info "使用 Homebrew 安装 MongoDB..."
            brew tap mongodb/brew
            brew install mongodb-community
            log_success "MongoDB 安装完成"
        else
            log_warning "请手动安装 MongoDB Community Server"
            echo "下载地址: https://www.mongodb.com/try/download/community"
        fi
    else
        log_warning "请手动安装 MongoDB Community Server"
        echo "下载地址: https://www.mongodb.com/try/download/community"
    fi
}

# 安装 Redis 本地版本
install_redis_local() {
    log_info "设置 Redis..."
    
    if command -v redis-server > /dev/null; then
        log_success "Redis 已安装"
        return 0
    fi
    
    # macOS 使用 Homebrew
    if [[ "$OSTYPE" == "darwin"* ]]; then
        if command -v brew > /dev/null; then
            log_info "使用 Homebrew 安装 Redis..."
            brew install redis
            log_success "Redis 安装完成"
        else
            log_warning "请手动安装 Redis"
            echo "下载地址: https://redis.io/download"
        fi
    else
        log_warning "请手动安装 Redis"
        echo "下载地址: https://redis.io/download"
    fi
}

# 创建环境配置文件
create_env_files() {
    log_info "创建环境配置文件..."
    
    # 后端环境配置
    if [ ! -f "./backend/.env" ]; then
        cat > ./backend/.env << 'EOF'
NODE_ENV=development
PORT=8000

# 数据库配置
MONGODB_URI=mongodb://localhost:27017/devops-smartbot
REDIS_URL=redis://localhost:6379

# JWT配置
JWT_SECRET=your-super-secret-jwt-key-change-this-in-production-$(openssl rand -hex 16)
JWT_EXPIRES_IN=7d

# OpenAI配置 (可选)
OPENAI_API_KEY=your-openai-api-key
OPENAI_MODEL=gpt-4

# 监控配置
PROMETHEUS_URL=http://localhost:9090
GRAFANA_URL=http://localhost:3000

# 日志配置
LOG_LEVEL=debug
LOG_FILE_PATH=./logs

# 邮件配置 (可选)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASS=your-app-password

# Webhook配置
WEBHOOK_SECRET=webhook-secret-key
EOF
        log_success "后端环境配置文件已创建"
    fi
    
    # 前端环境配置
    if [ ! -f "./frontend/.env" ]; then
        cat > ./frontend/.env << 'EOF'
REACT_APP_API_URL=http://localhost:8000/api
REACT_APP_WS_URL=http://localhost:8000
REACT_APP_VERSION=1.0.0
REACT_APP_ENV=development
EOF
        log_success "前端环境配置文件已创建"
    fi
}

# 启动本地服务
start_local_services() {
    log_info "启动本地服务..."
    
    # 启动 MongoDB
    if command -v mongod > /dev/null; then
        log_info "启动 MongoDB..."
        # 创建数据目录
        mkdir -p ./data/mongodb
        mongod --dbpath ./data/mongodb --port 27017 --fork --logpath ./data/mongodb.log
        sleep 3
        
        if pgrep mongod > /dev/null; then
            log_success "MongoDB 启动成功 (端口: 27017)"
        else
            log_warning "MongoDB 启动失败，请检查日志: ./data/mongodb.log"
        fi
    else
        log_warning "MongoDB 未安装，请先安装"
    fi
    
    # 启动 Redis
    if command -v redis-server > /dev/null; then
        log_info "启动 Redis..."
        redis-server --daemonize yes --port 6379 --logfile ./data/redis.log
        sleep 2
        
        if pgrep redis-server > /dev/null; then
            log_success "Redis 启动成功 (端口: 6379)"
        else
            log_warning "Redis 启动失败，请检查日志: ./data/redis.log"
        fi
    else
        log_warning "Redis 未安装，请先安装"
    fi
}

# 安装项目依赖
install_dependencies() {
    log_info "安装项目依赖..."
    
    # 安装后端依赖
    if [ ! -d "./backend/node_modules" ]; then
        log_info "安装后端依赖..."
        cd backend
        npm install
        cd ..
        log_success "后端依赖安装完成"
    else
        log_info "后端依赖已存在，跳过安装"
    fi
    
    # 安装前端依赖
    if [ ! -d "./frontend/node_modules" ]; then
        log_info "安装前端依赖..."
        cd frontend
        npm install
        cd ..
        log_success "前端依赖安装完成"
    else
        log_info "前端依赖已存在，跳过安装"
    fi
}

# 启动开发服务器
start_dev_servers() {
    log_info "启动开发服务器..."
    
    # 创建日志目录
    mkdir -p logs
    mkdir -p data
    
    # 启动后端
    log_info "启动后端服务..."
    cd backend
    npm run dev > ../logs/backend.log 2>&1 &
    BACKEND_PID=$!
    cd ..
    
    # 保存PID
    echo $BACKEND_PID > .backend.pid
    
    # 等待后端启动
    sleep 8
    
    # 检查后端状态
    if curl -f -s http://localhost:8000/health > /dev/null 2>&1; then
        log_success "后端服务启动成功: http://localhost:8000"
    else
        log_warning "后端服务可能启动失败，请检查日志: tail -f logs/backend.log"
    fi
    
    # 启动前端
    log_info "启动前端服务..."
    cd frontend
    npm run dev > ../logs/frontend.log 2>&1 &
    FRONTEND_PID=$!
    cd ..
    
    # 保存PID
    echo $FRONTEND_PID > .frontend.pid
    
    log_success "前端服务启动中: http://localhost:3000"
}

# 创建停止脚本
create_stop_script() {
    cat > ./scripts/stop-local-dev.sh << 'EOF'
#!/bin/bash

echo "🛑 停止本地开发服务..."

# 停止应用进程
if [ -f .backend.pid ]; then
    BACKEND_PID=$(cat .backend.pid)
    kill $BACKEND_PID 2>/dev/null || true
    rm .backend.pid
    echo "✅ 后端服务已停止"
fi

if [ -f .frontend.pid ]; then
    FRONTEND_PID=$(cat .frontend.pid)
    kill $FRONTEND_PID 2>/dev/null || true
    rm .frontend.pid
    echo "✅ 前端服务已停止"
fi

# 停止数据库服务
if pgrep mongod > /dev/null; then
    pkill mongod
    echo "✅ MongoDB 已停止"
fi

if pgrep redis-server > /dev/null; then
    pkill redis-server
    echo "✅ Redis 已停止"
fi

echo "🎉 所有服务已停止"
EOF
    chmod +x ./scripts/stop-local-dev.sh
}

# 显示状态信息
show_status() {
    echo ""
    echo "🎉 DevOps SmartBot 本地开发环境已启动！"
    echo "==========================================="
    echo ""
    echo "📱 前端应用:    http://localhost:3000"
    echo "🔧 后端 API:    http://localhost:8000"
    echo "📊 API 文档:    http://localhost:8000/api-docs"
    echo "🗄️  MongoDB:     mongodb://localhost:27017/devops-smartbot"
    echo "📦 Redis:       redis://localhost:6379"
    echo ""
    echo "📋 管理命令:"
    echo "   查看后端日志: tail -f logs/backend.log"
    echo "   查看前端日志: tail -f logs/frontend.log"
    echo "   停止服务:     ./scripts/stop-local-dev.sh"
    echo "   重启服务:     ./scripts/local-dev-setup.sh"
    echo ""
    echo "🔐 默认登录信息:"
    echo "   用户名: admin"
    echo "   密码:   admin123"
    echo ""
    echo "📚 后续步骤:"
    echo "   1. 打开浏览器访问 http://localhost:3000"
    echo "   2. 使用默认账号登录系统"
    echo "   3. 在设置中配置 OpenAI API Key (可选)"
    echo ""
}

# 主函数
main() {
    check_requirements
    install_mongodb_local
    install_redis_local
    create_env_files
    start_local_services
    install_dependencies
    start_dev_servers
    create_stop_script
    show_status
}

# 错误处理
trap 'log_error "脚本执行失败，请检查错误信息"' ERR

# 执行主函数
main "$@"